package com.xyx;

import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;

import com.facebook.cache.disk.DiskCacheConfig;
import com.facebook.common.internal.Supplier;
import com.facebook.common.internal.Suppliers;
import com.facebook.common.memory.NoOpMemoryTrimmableRegistry;
import com.facebook.common.util.ByteConstants;
import com.facebook.imagepipeline.cache.MemoryCacheParams;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.facebook.imagepipeline.decoder.SimpleProgressiveJpegConfig;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.facebook.react.shell.MainPackageConfig;

//https://www.jianshu.com/p/8ff81be83101
public class FrescoImageConfig {

    public  static ImagePipelineConfig getConfig(Application context){


        Suppliers suppliers = new Suppliers();
        Supplier<MemoryCacheParams> bitmapMemoryCacheParamsSupplier
                = new Supplier<MemoryCacheParams>() {
            int maxHeapSize = (int) Runtime.getRuntime().maxMemory()/5;

            @Override
            public MemoryCacheParams get() {
                return new MemoryCacheParams(
                        maxHeapSize,
                        30,
                        Integer.MAX_VALUE,
                        Integer.MAX_VALUE,
                        Integer.MAX_VALUE
                );
            }
        };

        //小图的缓存策略
        DiskCacheConfig smallDiskCacheConfig = DiskCacheConfig.newBuilder(context)
                .setBaseDirectoryPath(context.getExternalCacheDir()) // 设置缓存图片本地根目录路径
                .setBaseDirectoryName("cache_small_images") // 设置缓存Disk文件夹名称
                .setMaxCacheSize(100 * ByteConstants.MB) // 设置缓存Disk文件夹大小
                .setMaxCacheSizeOnLowDiskSpace(50 * ByteConstants.MB) // 设置低硬盘空间下缓存Disk文件夹大小
                .setMaxCacheSizeOnVeryLowDiskSpace(20 * ByteConstants.MB) // 设置非常低硬盘空间下缓存Disk文件夹大小
                .build();

        //主要图片的设置规则
        DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context)
                .setBaseDirectoryPath(context.getExternalCacheDir())//设置磁盘缓存路径
                .setBaseDirectoryName("cache_main_images")//设置磁盘缓存文件夹名称
                .setMaxCacheSize((long)(200* ByteConstants.MB))//设置磁盘缓存的大小
                .build();


       return ImagePipelineConfig.newBuilder(context)
               .setProgressiveJpegConfig(new SimpleProgressiveJpegConfig())// 渐进式配置
               .setBitmapsConfig(Bitmap.Config.RGB_565) // 没有透明图片显示要求，设置为RGB_565，减少内存开销
               .setDownsampleEnabled(true)
               .setSmallImageDiskCacheConfig(smallDiskCacheConfig) // 小图片Disk缓存策略
               .setMainDiskCacheConfig(diskCacheConfig)// 基本图片Disk缓存策略
                .setBitmapMemoryCacheParamsSupplier(bitmapMemoryCacheParamsSupplier)//设置已解码的内存缓存策略
                .setEncodedMemoryCacheParamsSupplier(bitmapMemoryCacheParamsSupplier)//设置未解码的内存缓存策略
               .setMemoryTrimmableRegistry(NoOpMemoryTrimmableRegistry.getInstance()) // 注册内存调用器，在需要回收内存的时候进行回收
               .setResizeAndRotateEnabledForNetwork(true) // 对网络图片进行resize处理，减少内存消耗
               .setDownsampleEnabled(true) // 必须和ImageRequest的ResizeOptions一起使用，作用就是在图片解码时根据ResizeOptions所设的宽高的像素进行解码，这样解码出来可以得到一个更小的Bitmap。
               .build();
    }



}
